package src.dp.rob;

public class no213 {//打家劫舍2
    /**
     * 1. dp数组下标含义：考虑下标i（包括i）以内的房屋，最多可以偷窃的金额为dp[i]
     * 2. 递推公式：考虑两种情况：含首不含尾；含尾不含首
     *      然后两种情况分别调用rob函数，就把环展开为线性数组了，再比较两个情况的结果
     *      dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
     * 3. 初始化数组：dp[start] = nums[start]  dp[start+1] = max(nums[start], nums[start+1]);
     * 4. 遍历顺序：dp[i] 是根据dp[i-2] 和 dp[i-1] 推导出来的，所以是从前到后遍历
     */

    public int rob(int[] nums) {
        if (nums.length == 0) return 0;
        if (nums.length == 1) return nums[0];
        int res1 = robRange(nums, 0, nums.length - 2);
        int res2 = robRange(nums, 1, nums.length - 1);
        return Math.max(res1, res2);
    }

    public int robRange(int[] nums, int start, int end) {
        int n = nums.length;
        int[] dp = new int[n];

        if(start == end) return nums[start];

        dp[start] = nums[start];
        dp[start+1] = Math.max(nums[start], nums[start+1]);

        for (int i = start+2; i <= end; i++) {
            dp[i] = Math.max( dp[i - 2] + nums[i], dp[i - 1] );
        }
        return dp[end];
    }
}
